from transitions import Machine
import random

# 70% 概率返回 True，30% 概率返回 False
random_bool = random.random() < 0.7
print(random_bool)


class Form:
    def __init__(self, name):
        self.name = name  # 表单名称
        self.history = []  # 用于存储历史状态

        # 定义状态
        self.states = [
            'draft',          # 草稿
            'submitted',      # 已提交（等待审核）
            'submission_failed',  # 提交失败
            'approved',       # 已审核（等待批准）
            'approval_failed',    # 审批失败
            'completed',      # 已完成
        ]

        # 定义状态转换
        self.transitions = [
            # 提交表单的结果
            {
                'trigger': 'submit',
                'source': 'draft',
                'dest': 'submitted',
                'conditions': 'is_submit_successful',
                'after': 'on_submit_success'},
            {
                'trigger': 'submit',
                'source': 'draft',
                'dest': 'submission_failed',
                'unless': 'is_submit_successful',
                'after': 'on_submit_fail'},

            # 审核表单的结果
            {
                'trigger': 'approve',
                'source': 'submitted',
                'dest': 'approved',
                'conditions': 'is_approval_successful',
                'after': 'on_approval_success'},
            {
                'trigger': 'approve',
                'source': 'submitted',
                'dest': 'approval_failed',
                'unless': 'is_approval_successful',
                'after': 'on_approval_fail'},

            # 提交失败后可以重新编辑并再次提交
            {
                'trigger': 'edit',
                'source': 'submission_failed',
                'dest': 'draft'},

            # 审批通过后完成表单
            {
                'trigger': 'complete',
                'source': 'approved',
                'dest': 'completed'},

            # 失败后可重新提交
            {
                'trigger': 'reset',
                'source': '*',
                'dest': 'draft'}
        ]

        # 初始化状态机
        self.machine = Machine(model=self, states=self.states,
                               transitions=self.transitions, initial='draft', auto_transitions=False)

    # 回调方法定义
    def is_submit_successful(self):
        """模拟提交是否成功"""
        print("检查提交是否成功...")
        if random.random() < 0.2:
            return True
        else:
            return False  # 假设提交成功

    def is_approval_successful(self):
        """模拟审批是否成功"""
        print("检查审批是否成功...")
        if random.random() < 0.3:
            return True
        else:
            return False  # 假设审批成功

    # 提交成功/失败的处理
    def on_submit_success(self):
        print(f"{self.name}: 表单提交成功，等待审核。")

    def on_submit_fail(self):
        print(f"{self.name}: 表单提交失败，回退到草稿状态。")
        # 记录当前状态到历史记录
        self.history.append(self.state)
        # 手动回退到草稿状态
        self.state = 'draft'

    # 审批成功/失败的处理
    def on_approval_success(self):
        print(f"{self.name}: 审核通过，等待完成。")

    def on_approval_fail(self):
        print(f"{self.name}: 审核未通过，回退到已提交状态。")
        # 记录当前状态到历史记录
        self.history.append(self.state)
        # 手动回退到已提交状态
        self.state = 'submitted'


# 测试使用
if __name__ == "__main__":
    # 创建表单实例
    my_form = Form("检验报告单")
    print(f"初始状态: {my_form.state}")

    # 提交表单
    my_form.submit()
    print(f"当前状态: {my_form.state}")

    # 审核表单
    try:
        # 主代码块
        actionName = '三轴平台检查'
        actionValue = '检查项'
        my_form.approve()
        print(f"当前状态: {my_form.state}")
    except Exception as e:
        # 异常时，执行该块
        msg_err = f'{actionName} 发生错误 {e}'
        print(msg_err)
    else:
        # 主代码块执行完，执行该块
        msg = actionName + '执行正常'
        print(msg)

    # 重置表单
    my_form.reset()
    print(f"当前状态: {my_form.state}")

    # 打印历史状态
    print("历史状态:", my_form.history)
